/*PGBD - T2_3 
Otávio Cassel
Raphael Miollo
Leonardo Steffenello*/

package Control;

import Model.Dado;

public class Controle {

    public static int confereDados(String transacao, String instrucao, String dado) {
        //-----------------------------------------------------------------------------------------------------
        //CONFERE SE A TRANSACAO NÃO ESTÁ AGUARDANDO     
        switch (transacao) {
            case "T1":
                if (!Dado.getAguardando(0).equals(" ")) {
                    return 4;
                }
                break;
            case "T2":
                if (!Dado.getAguardando(1).equals(" ")) {
                    return 4;
                }
                break;
        }
        //-----------------------------------------------------------------------------------------------------
        //LOCK - S  // BLOQUEIO COMPARTILHADO
        if (instrucao.equals("lock-S")) {
            if (transacao.equals("T1")) {
                if (Dado.getBloqueioExclusivo(dado).equals("0")) {
                    if (Dado.getBloqueioCompartilhado(dado).equals("T2")) {
                        Dado.setBloqueioCompartilhado(dado, "T1T2");
                    } else {
                        Dado.setBloqueioCompartilhado(dado, "T1");
                    }
                    return 1;
                } else {
                    if (!Dado.getBloqueioCompartilhado(dado).equals("T1")) {
                        Dado.setAguardando(0, instrucao + "=" + dado);
                        if ((!Dado.getAguardando(0).equals(" ")) && (!Dado.getAguardando(1).equals(" "))) {
                            return 5;
                        }
                        return 2;
                    }
                }
            } else {
                if (Dado.getBloqueioExclusivo(dado).equals("0")) {
                    if (Dado.getBloqueioCompartilhado(dado).equals("T1")) {
                        Dado.setBloqueioCompartilhado(dado, "T1T2");
                    } else {
                        Dado.setBloqueioCompartilhado(dado, "T2");
                    }
                    return 1;
                } else {
                    if (!Dado.getBloqueioCompartilhado(dado).equals("T2")) {
                        Dado.setAguardando(1, instrucao + "=" + dado);
                        if ((!Dado.getAguardando(0).equals(" ")) && (!Dado.getAguardando(1).equals(" "))) {
                            return 5;
                        }
                        return 2;
                    }
                }
            }
        } //-----------------------------------------------------------------------------------------------------
        //LOCK - X  // BLOQUEIO EXCLUSIVO
        else if (instrucao.equals("lock-X")) {
            if (transacao.equals("T1")) {
                if (!Dado.getBloqueioExclusivo(dado).equals("T2") && Dado.getBloqueioCompartilhado(dado).equals("0")) {
                    Dado.setBloqueioExclusivo(dado, "T1");
                    return 1;
                } else {
                    if (!Dado.getBloqueioCompartilhado(dado).equals("T1") && !Dado.getBloqueioCompartilhado(dado).equals("T1T2")) {
                        Dado.setAguardando(0, instrucao + "=" + dado);
                        if ((!Dado.getAguardando(0).equals(" ")) && (!Dado.getAguardando(1).equals(" "))) {
                            return 5;
                        }
                        return 2;
                    }
                }
            } else {
                if (!Dado.getBloqueioExclusivo(dado).equals("T1") && Dado.getBloqueioCompartilhado(dado).equals("0")) {
                    Dado.setBloqueioExclusivo(dado, "T2");
                    return 1;
                } else {
                    if (!Dado.getBloqueioCompartilhado(dado).equals("T2") && !Dado.getBloqueioCompartilhado(dado).equals("T1T2")) {
                        Dado.setAguardando(1, instrucao + "=" + dado);
                        if ((!Dado.getAguardando(0).equals(" ")) && (!Dado.getAguardando(1).equals(" "))) {
                            return 5;
                        }
                        return 2;
                    }
                }
            }
        } //-----------------------------------------------------------------------------------------------------
        //READ  // LEITURA
        else if ((instrucao.equals("read"))) {
            if (transacao.equals("T1")) {
                if (Dado.getBloqueioExclusivo(dado).equals("T1") || (Dado.getBloqueioCompartilhado(dado).equals("T1") || Dado.getBloqueioCompartilhado(dado).equals("T1T2"))) {
                    return 1;
                }
            } else {
                if (Dado.getBloqueioExclusivo(dado).equals("T2") || (Dado.getBloqueioCompartilhado(dado).equals("T2") || Dado.getBloqueioCompartilhado(dado).equals("T1T2"))) {
                    return 1;
                }
            }
        } //-----------------------------------------------------------------------------------------------------
        //WRITE // ESCRITA
        else if (instrucao.equals("write")) {
            if (transacao.equals("T1")) {
                if (Dado.getBloqueioExclusivo(dado).equals("T1") && Dado.getBloqueioCompartilhado(dado).equals("0")) {
                    return 1;
                }
            } else {
                if (Dado.getBloqueioExclusivo(dado).equals("T2") && Dado.getBloqueioCompartilhado(dado).equals("0")) {
                    return 1;
                }
            }
        }//-----------------------------------------------------------------------------------------------------
        //UNLOCK // DESBLOQUEIO
        else if (instrucao.equals("unlock")) {
            System.out.println("unlock");
            if (Dado.getBloqueioExclusivo(dado).equals(transacao)) {
                Dado.setBloqueioExclusivo(dado, "0");
                confereAguardo(transacao);
                return 1;
            } else if (Dado.getBloqueioCompartilhado(dado).equals(transacao)) {
                Dado.setBloqueioCompartilhado(dado, "0");
                confereAguardo(transacao);
                return 1;
            } else if (Dado.getBloqueioCompartilhado(dado).equals("T1T2")) {
                if (transacao.equals("T1")) {
                    Dado.setBloqueioCompartilhado(dado, "T2");
                    confereAguardo(transacao);
                    return 1;
                } else {
                    Dado.setBloqueioCompartilhado(dado, "T1");
                    confereAguardo(transacao);
                    return 1;
                }
            }
        }
        return 3;
    }

    private static void confereAguardo(String transacao) {
        if (transacao.equals("T1")) {
            if (!Dado.getAguardando(1).equals(" ")) {
                String[] array = Dado.getAguardando(1).split("=");
                if (array[0].equals("lock-S")) {
                    Dado.setBloqueioCompartilhado(array[1], "T2");
                } else {
                    Dado.setBloqueioExclusivo(array[1], "T2");
                }
                Dado.setAguardando(1, " ");
            }
        } else {
            if (!Dado.getAguardando(0).equals(" ")) {
                String[] array = Dado.getAguardando(1).split("=");
                if (array[0].equals("lock-S")) {
                    Dado.setBloqueioCompartilhado(array[1], "T2");
                } else {
                    Dado.setBloqueioExclusivo(array[1], "T2");
                }
                Dado.setAguardando(0, " ");
            }

        }
    }

    public static void kill(String T, String deadlock) {
        String[] array = deadlock.split("=");
        if (array[0].equals("lock-S")) {
            Dado.setBloqueioCompartilhado(array[1], "0");
        } else {
            Dado.setBloqueioExclusivo(array[1], "0");
        }
        if(T.equals("T1")){
            Dado.setAguardando(0, " ");
        }else{
            Dado.setAguardando(1, " ");
        }
    }
}
